<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    * 函数深挖：
    *   arguments：参数对象，它不存在全局之中。只存在于函数当中，由描述函数接收的参数所形成的一个对象
    *       1.callee 指向这个函数，我们知道这个函数是谁
    *
    *       function foo(){
    *           console.log(arguments.callee)//arguments是一个类数组对象
    *       }
    *       foo()
    *
    *       ;(function(){ //一般来说我们无法访问立执行函数本身，但是可以通过arguments.callee来实现访问
    *           console.log(arguments.callee)
    *       })()
    *
    *       2.length 实参参数个数 可以不定参数传参
    *
    *       实现一个需求 做一个sum函数 接收若干个参数 返回他们的参数之和
    *
    *       function sum(){
    *           let result = 0
    *           for(let i =0,length = arguments.length;i < length;i++){
    *               result += arguments[i]
    *           }
    *           return result
    *       }
    *
    *       3.arguments不适合箭头函数 箭头函数不是一个纯粹的函数 而是一个函数表达式 所以不存在arguments
    *
    *       如何在箭头函数中实现不定参数传值？
    *       就要用到es6中arguments的替代品: ... 叫做剩余参数
    *
    *       第一种用法：打包参数的能力，例如可以除了第一个，将后续的参数打包在一起，形成一个数组
    *                 或者前面若干个参数可以分开传递，最后加上 ...rest 可以将剩余参数传递到一起
    *
    *       function foo(name, ...rest){
    *           console.log(name,rest)
    *       }
    *
    *       foo("银时","大","家"，“好”)
    *
    *       用箭头函数表示就是
    *       let f = (...rest) => {
    *           for(let i = 0;i < rest.length;i++){
    *               console.log(rest)
    *           }
    *       }
    *
    *       第二种用法：分发参数的能力，将一个数组或者对象里的内容拆开
    *
    *
    *       function foo1(...rest){ //形参：接收参数，入
    *           console.log(rest)
    *       }
    *       foo1(1,2,3,4)
    *
    *       对比
    *
    *       let arr = [1,2,3,4]
    *       console.log(...arr) //实参：传递参数，出 这里会将数组拆分成一项一项的内容
    *
    *       let arr1 = [1,2]
    *       let arr2 = [3,4]
    *       console.log([...arr1, ...arr2]) //将两个数组拆开并合成单独一项数组 [1,2,3,4]
    *
    *       let arr1 = [1,2]
    *       let arr2 = [3,4]
    *       console.log(...[arr1,arr2]) //会先合成一个数组（数组中包含两项数组）再拆成两个数组 [1,2] [3,4]
    *
    *       拆对象：
    *       let obj1 = {a:1}
    *       let obj2 = {b:2,c:3}
    *       console.log({...obj1, ...obj2}) //{a:1,b:2,c:3}
    *
    *
    * */






</script>
</body>
</html>